// var n;
// exports.GuideCtrl = void 0;
// var $bundleConfig = require("./BundleConfig");
// var $singletonManager = require("./SingletonManager");
// var $resLoader = require("./ResLoader");
// var $resUtil = require("./ResUtil");
// var $guideMask = require("./GuideMask");
// var $guideShou = require("./GuideShou");
// var h = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t.shouArray = [];
//         return t;
//     }
//     __extends(t, e);
//     t.prototype.ShowOneShou = function (e) {
//         return __awaiter(this, void 0, void 0, function () {
//             var t;
//             var o;
//             var n;
//             var i;
//             return __generator(this, function (a) {
//                 switch (a.label) {
//                     case 0:
//                         t = this;
//                         o = function () {
//                             t.RecycleOneShou(n);
//                             e.parent.off(cc.Node.EventType.TOUCH_START, o);
//                         };
//                         return this.shouArray.length > 0 ? ((n = this.shouArray.shift()), [3, 4]) : [3, 1];
//                     case 1:
//                         if (this.guideShowPfb) {
//                             return [3, 3];
//                         } else {
//                             return (
//                                 (i = this),
//                                 [
//                                     4,
//                                     $resLoader.default.loadRes(
//                                         $bundleConfig.BundleNames.Common,
//                                         "prefab/GuideShou",
//                                         cc.Prefab
//                                     )
//                                 ]
//                             );
//                         }
//                     case 2:
//                         i.guideShowPfb = a.sent();
//                         a.label = 3;
//                     case 3:
//                         n = cc.instantiate(this.guideShowPfb);
//                         a.label = 4;
//                     case 4:
//                         n.parent = e.parent;
//                         n.stopAllActions();
//                         n.active = !0;
//                         n.setPosition(e.x, e.y);
//                         if (e.isWillClickClose) {
//                             e.parent.on(cc.Node.EventType.TOUCH_START, o);
//                         }
//                         if (e.getFingerCallBack) {
//                             e.getFingerCallBack(n);
//                         }
//                         n.getComponent($guideShou.default).StartSet(e.isWillClickClose);
//                         return [2];
//                 }
//             });
//         });
//     };
//     t.prototype.RecycleOneShou = function (e) {
//         e.active = !1;
//         e.removeFromParent(!1);
//         this.shouArray.push(e);
//     };
//     t.prototype.cleanGuide = function () {
//         if (this.guideMask) {
//             this.guideMask.destroy();
//             this.guideMask = null;
//         }
//     };
//     t.prototype.ShowGuide = function (e) {
//         return __awaiter(this, void 0, void 0, function () {
//             var t;
//             var o;
//             var n;
//             return __generator(this, function (i) {
//                 switch (i.label) {
//                     case 0:
//                         if (this.guideMask) {
//                             return [3, 2];
//                         } else {
//                             return [
//                                 4,
//                                 $resLoader.default.loadRes(
//                                     $bundleConfig.BundleNames.Common,
//                                     "prefab/GuideMask",
//                                     cc.Prefab
//                                 )
//                             ];
//                         }
//                     case 1:
//                         t = i.sent();
//                         o = cc.director.getScene().getChildByName("Canvas");
//                         (n = $resUtil.ResUtil.instantiate(t)).parent = o;
//                         this.guideMask = n.getComponent($guideMask.default);
//                         n.setPosition(0, 0);
//                         i.label = 2;
//                     case 2:
//                         this.guideMask.node.zIndex = 1e3;
//                         this.guideMask.node.active = !0;
//                         this.guideMask.StartSet(e);
//                         return [2];
//                 }
//             });
//         });
//     };
//     t.prototype.ShowGuideMaskKuang = function (e, t) {
//         var n = t.convertToWorldSpaceAR(cc.v2(0, 0));
//         var i = cc.size(1e3, 1700);
//         var a = 500 + (t.height - 1334) / 2;
//         exports.GuideCtrl.ShowGuide({
//             wPos: n,
//             size: i,
//             alwaysShow: !0,
//             sayNodePos: cc.v2(0, a),
//             callBack: null,
//             sayStr: e,
//             isHideBtn: !0,
//             noMaskTween: !0
//         });
//     };
//     return t;
// })($singletonManager.SingletonMgr);
// exports.GuideCtrl = h.getInstance();

import { BundleNames } from './BundleConfig';
import { SingletonBase } from './SingletonManager';
import ResLoader from './ResLoader';
import { ResourceUtil } from './ResUtil';
import GuideMask from './GuideMask';
import GuideShou from './GuideShou';

/**
 * 引导控制器类
 * 建议类名: GuideController
 */
class GuideController extends SingletonBase {
    // 手指引导节点数组
    private shouNodeArray: cc.Node[] = [];
    // 引导显示 Prefab
    private guideShowPrefab: cc.Prefab | null = null;
    // 引导遮罩
    private guideMaskInstance: GuideMask | null = null;

    constructor() {
        super();
    }

    /**
     * 显示一个手指引导
     * @param guideParams 引导参数
     * 建议方法名: showOneFingerGuide
     */
    public async showOneFingerGuide(guideParams: any): Promise<void> {
        const self = this;
        const touchStartCallback = function () {
            self.recycleOneFingerGuide(fingerNode);
            guideParams.parent.off(cc.Node.EventType.TOUCH_START, touchStartCallback);
        };

        let fingerNode: cc.Node;
        if (this.shouNodeArray.length > 0) {
            fingerNode = this.shouNodeArray.shift()!;
        } else {
            if (!this.guideShowPrefab) {
                this.guideShowPrefab = await ResLoader.loadRes(
                    BundleNames.Common,
                    'prefab/GuideShou',
                    cc.Prefab
                );
            }
            fingerNode = cc.instantiate(this.guideShowPrefab);
        }

        fingerNode.parent = guideParams.parent;
        fingerNode.stopAllActions();
        fingerNode.active = true;
        fingerNode.setPosition(guideParams.x, guideParams.y);

        if (guideParams.isWillClickClose) {
            guideParams.parent.on(cc.Node.EventType.TOUCH_START, touchStartCallback);
        }

        if (guideParams.getFingerCallBack) {
            guideParams.getFingerCallBack(fingerNode);
        }

        fingerNode.getComponent(GuideShou).initializeSettings(guideParams.isWillClickClose);
    }

    /**
     * 回收一个手指引导
     * @param fingerNode 手指节点
     * 建议方法名: recycleOneFingerGuide
     */
    public recycleOneFingerGuide(fingerNode: cc.Node): void {
        fingerNode.active = false;
        fingerNode.removeFromParent(false);
        this.shouNodeArray.push(fingerNode);
    }

    /**
     * 清理引导
     * 建议方法名: clearGuide
     */
    public clearGuide(): void {
        if (this.guideMaskInstance) {
            this.guideMaskInstance.destroy();
            this.guideMaskInstance = null;
        }
    }

    /**
     * 显示引导
     * @param guideParams 引导参数
     * 建议方法名: showGuide
     */
    public async showGuide(guideParams: any): Promise<void> {
        if (!this.guideMaskInstance) {
            const guideMaskPrefab = await ResLoader.loadRes(
                BundleNames.Common,
                'prefab/GuideMask',
                cc.Prefab
            );
            const canvas = cc.director.getScene().getChildByName('Canvas');
            const guideMaskNode = ResourceUtil.instantiate(guideMaskPrefab);
            guideMaskNode.parent = canvas;
            this.guideMaskInstance = guideMaskNode.getComponent(GuideMask);
            guideMaskNode.setPosition(0, 0);
        }

        this.guideMaskInstance.node.zIndex = 1000;
        this.guideMaskInstance.node.active = true;
        this.guideMaskInstance.initializeGuide(guideParams);
    }

    /**
     * 显示引导遮罩框
     * @param sayContent 说话内容
     * @param targetNode 目标节点
     * 建议方法名: showGuideMaskFrame
     */
    public showGuideMaskFrame(sayContent: string, targetNode: cc.Node): void {
        const worldPosition = targetNode.convertToWorldSpaceAR(cc.v2(0, 0));
        const maskSize = cc.size(1000, 1700);
        const sayNodePositionY = 500 + (targetNode.height - 1334) / 2;

        this.showGuide({
            wPos: worldPosition,
            size: maskSize,
            alwaysShow: true,
            sayNodePos: cc.v2(0, sayNodePositionY),
            callBack: null,
            sayStr: sayContent,
            isHideBtn: true,
            noMaskTween: true
        });
    }
}

export const GuideCtrlInstance = GuideController.getInstance();

/**
 * 优化说明:
 * 1. 修改了私有变量名，使其更具可读性，见名知义。
 * 2. 修改方法参数名，使其更具描述性，便于理解。
 * 3. 为每个方法添加了详细的文档注释，建议方法名。
 */